package com.situ.view;

import java.io.Serializable;
import java.util.Date;

import com.situ.domain.Car;
import com.situ.domain.Record;
import com.situ.domain.SpotEnum;
import com.situ.domain.StateSpotEnum;
import com.situ.service.RecordArrayList;
import com.situ.service.SpotService;

public class ParkingViews implements Serializable {
    /** serialVersionUID*/  
    private static final long serialVersionUID = 115616546416541L;
    
    RecordArrayList recordList = new RecordArrayList();
    
    /**
     * <p>Title: menu</p>  
     * <p>Description: 打印菜单</p>  
     * @author 恩策
     * @date 2021年7月27日
     */
    public char menu() {
        System.out.println("**********象牙山停车场**********");
        System.out.println("1.停车记录\t\t2.停车位状态");
        System.out.println("3.停车\t\t\t4.取车");
        System.out.println("\t\t\t0.退出系统");
        System.out.println("象牙山停车场停车位共10个");
        System.out.println("当前空余停车位：" + SpotService.getFreeSpot() + "个");
        System.out.println("\t\t\t请输入(0-4):");
        return TSUtility.readMenuSelection();
    }
    
    /**
     * <p>Title: listRecords</p>  
     * <p>Description: 打印停车记录</p>  
     * @author 恩策
     * @date 2021年7月27日
     */
    public void listRecords() {
        System.out.println("序号\t车牌号\t\t车辆高度\t停车位\t停车时间\t\t\t取车时间\t\t\t费用");
        for (Record record : recordList.listRecords()) {
            System.out.println(record);
        }
        // 换行，与菜单形成明显间隔
        System.out.println();
    }
    
    /**
     * <p>Title: listSpot</p>  
     * <p>Description: 打印停车场状态</p>  
     * @author 恩策
     * @date 2021年7月27日
     */
    public void listSpots() {
        for (int i = 0; i < 10; i++) {
            System.out.print(i + 1 + "号位\t");
        }
        System.out.println();
        for (SpotEnum spot : SpotEnum.values()) {
            if (spot.equals(SpotEnum.ZREOTH)) {
                continue;
            }
            if (spot.getState().equals(StateSpotEnum.FREE)) {
                System.out.print(" " + "空闲" + " \t");
            } else {
                System.out.print("(" + "占用" + ")\t");
            }
        }
        // 换行，与菜单形成明显间隔
        System.out.println();
    }
    
    /**
     * <p>Title: insertCar</p>  
     * <p>Description: 停车</p>  
     * @author 恩策
     * @date 2021年7月27日
     */
    public void insertCar(){
        String licence = "";
        double high = 3.0D;
        int numSpot = 0;
        boolean flag = true;
        SpotEnum spotEnum = SpotEnum.ZREOTH;
        // 停车场以满
        if (SpotService.getFreeSpot() == 0) {
            System.out.println("已无闲停车位！");
            return;
        }
        // 输入车牌号，限制车牌号非空，并且小于8个字符
        System.out.println("车牌号:");
        licence = TSUtility.readKeyBoard(8, false);  
        // 车辆高度限制
        System.out.println("车辆高度:");
        high = TSUtility.readDouble();
        if (high >= 3.0) {
            System.out.println("您的车辆高度为" + high + "米，超过本停车场高度限制：3米。" + "您的车辆无法入内");
            return;
        }
        // 选择的停车位是否已经被占用
        while(flag) {
            System.out.println("停车位:");
            numSpot = TSUtility.readInt();
            // 限制停车位选择
            if (numSpot > 10 || numSpot < 1) {
                System.out.println("停车位选择错误，请重新选择(1-10)");
                continue;
            }
            spotEnum = SpotEnum.values()[numSpot];
            if (StateSpotEnum.BUSY.equals(spotEnum.getState())) {
                System.out.println("该停车位已被占用");
                continue;
            } else {
                flag = false;
            }
        }
        
        recordList.insertRecord(new Record(new Car(licence, high), spotEnum, new Date()));
        // 停车位状态改变
        spotEnum.setState();
    }
    
    /**
     * <p>Title: getCar</p>  
     * <p>Description: 取车</p>  
     * @author 恩策
     * @date 2021年7月27日
     */
    public void getCar() {
        String licence = "";
        int numSpot = 0;
        int state = -1;
        
        // 输入车牌号，限制车牌号非空，并且小于8个字符
        System.out.println("车牌号:");
        licence = TSUtility.readKeyBoard(8, false);
        System.out.println("停车位:");
        numSpot = TSUtility.readInt();
        state = recordList.outCar(licence, numSpot);
        // 停车返回处理
        switch (state) {
        case 0:
            System.out.println("取车成功");
            // 改变停车位状态
            SpotEnum.values()[numSpot].setState();
            break;
        case 1:
            System.out.println("取车失败, 停车位输入错误");
            break;
        case 2:
            System.out.println("取车失败, 停车位与车牌号不匹配错误");
            break;

        default:
            break;
        }
        System.out.println();
    }

}
